<?php
class Validacao{
	
	private $post;
	private $rules;
	
	public function __construct($post, $rules){
		$this->post = $post;
		$this->rules = $rules;
	}
	
	public function validar(){
		foreach($this->rules as $field=>$rule){
			// REQUIRED - Ex. Uso: ( 'required'=>'true' )
			if(isset($rule["required"]) && $rule["required"] == true){
				$this->required($field);
			}
			
			// EMAIL - Ex. Uso: ( 'email'=>'true' )
			if(isset($rule["email"]) && $rule["email"] == true){
				$this->email($field);
			}
			
			// CPF - Ex. Uso: ( 'cpf'=>'true' )
			if(isset($rule["cpf"]) && $rule["cpf"] == true){
				$this->cpf($field);
			}
			
			// CEP - Ex. Uso: ( 'cep'=>'true' )
			if(isset($rule["cep"]) && $rule["cep"] == true){
				$this->cep($field);
			}
			
			// MAXLENTH - Ex. Uso: ( 'maxlenth'=>'10' )
			if(isset($rule["maxlenth"])){
				$this->maxlenth($field,$rule["maxlenth"]);
			}
			
			// MINLENTH - Ex. Uso: ( 'minlenth'=>'3' )
			if(isset($rule["minlenth"])){
				$this->minlenth($field,$rule["minlenth"]);
			}
			// DATA - Ex. Uso: ( 'data'=>'ptbr' or 'data'=>'usa' )
			if(isset($rule["data"])){
				$this->data($field,$rule["data"]);
			}
			
			// NUMERIC - Ex. Uso: ( 'numeric'=>'true' )
			if(isset($rule["numeric"]) && $rule["numeric"] == true){
				$this->numeric($field);
			}
			
		}
	}
	
	private function required($field){
		if(!(isset($this->post[$field]) && !empty($this->post[$field])))
			throw new ValidacaoException("Campo $field obrigatório",0);
	}
	
	private function email($field){
		$conta = "^[a-zA-Z0-9\._-]+@";
		$domino = "[a-zA-Z0-9\._-]+.";
		$extensao = "([a-zA-Z]{2,4})$";
		$pattern = $conta.$domino.$extensao;
		if (!(isset($this->post[$field]) && ereg($pattern, $this->post[$field])))
			throw new ValidacaoException("Campo $field - formato inválido",1);
	}
	
	private function cpf($field) {
		if (!(isset($this->post[$field]) && ereg("^([0-9]{3}\.){2}[0-9]{3}-[0-9]{2}$",$this->post[$field])))
			throw new ValidacaoException("Campo $field - formato inválido",2);
		
		// Verifiva se o número digitado contém todos os digitos
		$cpf = $this->post[$field];
    	$cpf = str_pad(ereg_replace('[^0-9]', '', $cpf), 11, '0', STR_PAD_LEFT);
		// Verifica se nenhuma das sequências abaixo foi digitada, caso seja, retorna falso
	    if (strlen($cpf) != 11 || $cpf == '00000000000' || $cpf == '11111111111' || $cpf == '22222222222' || $cpf == '33333333333' || $cpf == '44444444444' || $cpf == '55555555555' || $cpf == '66666666666' || $cpf == '77777777777' || $cpf == '88888888888' || $cpf == '99999999999')
		{
			throw new ValidacaoException("Campo $field - inválido",2);
	    }
		else
		{   // Calcula os números para verificar se o CPF é verdadeiro
	        for ($t = 9; $t < 11; $t++) {
	            for ($d = 0, $c = 0; $c < $t; $c++) {
	                $d += $cpf{$c} * (($t + 1) - $c);
	            }
	
	            $d = ((10 * $d) % 11) % 10;
	
	            if ($cpf{$c} != $d) {
	               throw new ValidacaoException("Campo $field - inválido",2);
	            }
	        }
		}	
	}
	
	private function cep($field) {
		if (!(isset($this->post[$field]) && ereg("^[0-9]{5}-[0-9]{3}$",$this->post[$field])))
			throw new ValidacaoException("Campo $field - formato inválido",3);
	}
	
	private function maxlenth($field,$tam){
		if(strlen($this->post[$field]) > $tam)
			throw new ValidacaoException("Campo $field - tamanho máximo não respeitado",4);
	}
	
	private function minlenth($field,$tam){
		if(strlen($this->post[$field]) < $tam)
			throw new ValidacaoException("Campo $field - tamanho mínimo não respeitado",5);
	}
	
	private function data($field,$type = "ptbr"){
		if($type == "ptbr"){
			$expressao = "^[0-9]{2}/[0-9]{2}/[0-9]{4}$";
		}else if($type == "usa"){
			$expressao = "^[0-9]{2}-[0-9]{2}-[0-9]{4}$";
		}else{
			throw new ValidacaoException("Especifique o tipo da validação da data( \"ptbr\" ou \"usa\" )",6);
		}

		if (!(isset($this->post[$field]) && ereg($expressao,$this->post[$field])))
			throw new ValidacaoException("Campo $field - formato inválido",6);
			
		if($type == "ptbr"){
			$data = explode("/",$this->post[$field]);
			if(date("d/m/Y",mktime(0,0,0,$data[1],$data[0],$data[2])) != $this->post[$field])
				throw new ValidacaoException("Campo $field - inválido",6);
		}else if($type == "usa"){
			$data = explode("-",$this->post[$field]);
			if(date("m-d-Y",mktime(0,0,0,$data[0],$data[1],$data[2])) != $this->post[$field])
				throw new ValidacaoException("Campo $field - inválido",6);
		}
	}
	
	private function numeric($field){
		if(!is_numeric($this->post[$field]))
			throw new ValidacaoException("Campo $field - só aceita caracter numérico",7);
	}
	
}
?>